package com.macro.mall.ums.service.account;

import com.github.pagehelper.Page;
import com.macro.mall.ums.domain.Member;
import com.macro.mall.ums.entity.MemberEntity;
import com.macro.mall.ums.service.account.bo.InsertMemberInput;
import com.macro.mall.ums.service.account.bo.PagedQueryMemberInput;
import com.macro.mall.ums.service.account.bo.UpdateMemberInput;

import java.util.List;

/**
 * 会员Service
 *
 * @author xuyanjun
 * @date 2019-12-09
 */
public interface MemberService {

    /**
     * 生成邀请码
     *
     * @return 邀请码
     */

    String generateInvitationCode();

    /**
     * 新增会员
     *
     * @param input input
     * @return 新增id
     */
    long insert(InsertMemberInput input);

    /**
     * 修改上级id
     *
     * @param userId 用户id
     * @param befId 上级id
     */
    void updateBefId(long userId, long befId);

    /**
     * 修改会员
     *
     * @param input input
     */
    void update(UpdateMemberInput input);

    /**
     * 删除会员
     *
     * @param id id
     */
    void delete(long id);

    /**
     * 根据Id获取会员
     *
     * @param id id
     * @return 会员
     */
    MemberEntity getById(long id);

    /**
     * 根据邀请码获取用户
     *
     * @param invitationCode 邀请码
     * @return 用户
     */
    MemberEntity getByInvitationCode(String invitationCode);

    /**
     * 根据批量Id获取会员
     *
     * @param batchIds 批量ids
     * @return 会员集合
     */
    List<MemberEntity> listByBatchIds(List<Long> batchIds);

    /**
     * 获取用户的所有的上级
     *
     * @param userId 用户id
     * @return 用户的所有的上级
     */
    List<MemberEntity> listBefUsers(long userId);

    /**
     * 分页查询
     *
     * @param input input
     * @return 分页的会员
     */
    Page<MemberEntity> pagedQuery(PagedQueryMemberInput input);

    /**
     * 获取粉丝数量
     *
     * @param userId 用户id
     * @return 粉丝数量
     */
    long countOfFans(long userId);

    /**
     * 将实体对象转换成domain对象
     *
     * @param memberEntity 实体
     * @return member
     */
    Member entityToDomain(MemberEntity memberEntity);

    /**
     * 将实体对象转换成domain对象
     *
     * @param memberEntities 实体
     * @return members
     */
    List<Member> entityToDomain(List<MemberEntity> memberEntities);

}